import pymysql


# 定义 数据库工具类
class DBTools(object):
    # 创建连接 - 类方法。 可以直接使用类名调用！
    # 类方法的形参都是cls,普通方法都是self
    @classmethod
    # __加两条下划线时私有方法，把这个工具类给别人用时，客户用类名调用方法时，只看到到公有方法
    def __create_conn(cls):
        conn = pymysql.connect(host="192.168.119.128", port=3306, user="root",
                               password="123456", database="test", charset="utf8")
        return conn

    # 查一条记录;查多条的话，再创建一个方法，将提取的方法更改一下即可
    @classmethod
    def query_one(cls,sql):
        my_conn = None
        my_cursor = None
        res = None
        try:
            # 创建连接 借助类名，调用 类方法 create_conn
            my_conn = DBTools().__create_conn()
            # 创建游标
            my_cursor = my_conn.cursor()
            # 执行 sql 语句，做查询
            my_cursor.execute(sql)
            # 提取一条记录
            res = my_cursor.fetchone()
        except Exception as err:
            print("查询失败:",str(err))
        finally:
            # 关闭游标
            my_cursor.close()
            # 关闭连接
            my_conn.close()
            # 返回记录,return后，此方法后面的代码不再执行，所以关闭游标和连接在return之前
            return res

    # 增删改记录
    @classmethod
    def db_uid(cls,sql):
        my_conn = None
        my_cursor = None
        try:
            # 创建连接
            my_conn = DBTools.__create_conn()
            # 创建游标
            my_cursor = my_conn.cursor()
            # 执行增删改 sql 语句
            my_cursor.execute(sql)
            # 提交事务
            my_conn.commit()
            # 返回成功后的提示
            print("执行增删改语句成功：", my_conn.affected_rows())
        except Exception as err:
            print("执行增删改语句失败：",str(err))
            # 回滚事务
            my_conn.rollback()
        finally:
            # 关闭游标
            my_cursor.close()
            # 关闭连接
            my_conn.close()

    # 查所有记录
    @classmethod
    def query_all(cls,sql):
        my_conn = None
        my_cursor = None
        res = None
        try:
            # 创建连接 借助类名，调用 类方法 create_conn
            my_conn = DBTools().__create_conn()
            # 创建游标
            my_cursor = my_conn.cursor()
            # 执行 sql 语句，做查询
            my_cursor.execute(sql)
            # 提取所有记录
            res = my_cursor.fetchall()
        except Exception as err:
            print("查询所有记录失败：",str(err))
        finally:
            # 关闭游标
            my_cursor.close()
            # 关闭连接
            my_conn.close()
            # 返回记录
            return res

if __name__ == '__main__':
        # res = DBTools().query_one("select * from students")
        # print("查询一条语句：",res)
        #
        # res1 = DBTools.query_all("select * from students")
        # print("查询所有语句：",res1)

        # DBTools.db_uid("DELETE FROM students WHERE studentNo = '15'")
        # DBTools.db_uid("UPDATE students set age = age + 1 WHERE studentNo = 15")
        DBTools.db_uid("INSERT INTO students(studentNo,name,sex,hometown,age,class,card) VALUES (015,'姬如雪','女','武汉',19,'1班',340322199000297656)")
